package lift_simulator;
import java.util.ArrayList;
import java.util.HashSet;

/**
 * ビルの各階を表現するオブジェクトです。<br>
 * ・何階か？<br>
 * ・この階で乗車するタスクのリスト<br>
 * のフィールドを持っています。
 * @see Task
 * @author Yone6379univ
 *
 */
public class Floor {
	/**
	 * このオブジェクトが表現する階
	 */
    private int floor;
    /**
     * この階から乗車するタスクのリスト
     */
    private ArrayList<Task> tasks;
	public Floor(int floor) {
		super();
		this.floor = floor;
		this.tasks = new ArrayList<Task>();
	}
	public int getFloor() {
		return floor;
	}
	public void setFloor(int floor) {
		this.floor = floor;
	}
	public void addTask(Task task){
		this.tasks.add(task);
	}
	public void removeTask(Task task){
		this.tasks.remove(task);
	}
	/**
	 * シミュレーションが終了可能か判定するためのメソッドです。
	 * <br>タスクの数が０であればtrueを返します。
	 * @return この階のタスクがすべて終了しているか
	 */
	public boolean isFinished(){
		return tasks.size()==0;
	}
	/**
	 * 指定された時間に乗車可能なタスクをすべて乗車可能にします。<br>
	 * 乗車可能か指定するメソッドは{@link Task#setCanRide(boolean)}です。
	 * @param clock 指定する時刻(基本的に現在時刻)
	 */
	public void updateTasks(Clock clock) {	
		for(Task task : tasks){
			//タスクの乗車可能時刻が現在の時刻以上なら
			if(clock.compare(task.getBoardTime()) >= 0){
				task.setCanRide(true);
			}
		}
	}
	/**
	 * タスクの一覧を返します。
	 * 引数にtrueを指定した場合、すでに乗車可能なタスクのみ返されます。<br>
	 * ※フロアのタスクリストを操作する場合は、{@link #addTask(Task)}または
	 * {@link #removeTask(Task)}を利用して下さい。返ってきたリストを操作しても
	 * 反映されません。
	 * @param includeCantRide
	 * @return
	 */
	public ArrayList<Task> getTasks(boolean onlyCantRide) {
		if(onlyCantRide){
			ArrayList<Task> ret = new ArrayList<Task>();
			for(Task task:tasks){
				if(task.isCanRide())
					ret.add(task);
			}
			return ret;
		}else{
			return new ArrayList<Task>(tasks);
		}
	}
	/**
	 * この階にある、指定されたIDのTaskを返します。
	 * 第二引数にtrueを指定した場合、すでに搭乗可能である場合のみ返却されます。
	 * @param id
	 * @return
	 */
	public Task getTaskByID(int id, boolean onlyCantRide){
		ArrayList<Task> list = getTasks(onlyCantRide);
		for(Task task:list){
			if(task.getId()==id)
				return task;
		}
		return null;
	}
}
